package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaCliente;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteBean;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteListaRes;
import com.sisgesbyte.services.administracion.bean.ZonaBean;
import com.sisgesbyte.services.proyeccion.MantProyeccionClienteService;
import com.sisgesbyte.services.proyeccion.bean.FiltroProyClienteBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyCanalMarcasResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionGeneralMarcasBean;
import com.sisgesbyte.services.ventas.MantVendedorClienteService;
import com.sisgesbyte.services.ventas.MantenimientoFFVVService;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.MantenimientoZona;
import com.sisgesbyte.services.ventas.bean.FFVVBean;
import com.sisgesbyte.services.ventas.bean.FiltroVendedoClienteFO;
import com.sisgesbyte.services.ventas.bean.ListaFFVVJerarquiaResponse;
import com.sisgesbyte.services.ventas.bean.ListaVendedorClienteResponse;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;
import com.sisgesbyte.services.ventas.bean.VendedorClienteBean;
import com.sisgesbyte.services.ventas.bean.ZonaListaResponse;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class ResumenProyClientesMarcasMBean implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantProyeccionClienteService mantProyeccionClienteService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@EJB
	private MantenimientoZona mantenimientoZona;
	@EJB
	private MantenimientoCategoriaCliente mantenimientoCategoriaCliente;
	@EJB
	private MantVendedorClienteService mantVendedorClienteService;
	@EJB
	private MantenimientoFFVVService mantenimientoFFVVService;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private List<PeriodoBean> listaPeriodos;
	private List<ZonaBean> listaZonas;
	private List<CategoriaClienteBean> listaCanales;
	private List<VendedorClienteBean> listaClientes;
	private List<ProyeccionGeneralMarcasBean> listaProyeccionClienteMarcas;
	private List<FFVVBean> listaFFVV;
	private int periodoDefault;
	private int idZona;
	private int idCanal;
	private int idFfvv;
	private int idCliente;
	private int idLocalCliente;
	private String totalMarcas;
	
	@PostConstruct
	private void init() {
		periodoDefault = 0;
		System.out.println("Ingresaa");
		cargarPeriodos();
		mostrarPeriodoDefault();
		cargarZonas();
		cargarCanales();
	}

	public void inicializar(){
		//capturamos el idCliente y localCliente
		for(VendedorClienteBean ls : listaClientes){
			if(idLocalCliente == ls.getClienteLocalesId()){
				setIdCliente(ls.getClienteId());
				break;
			}
		}
	
		if(idCliente < 1 || idLocalCliente< 1 || periodoDefault < 1){
			System.out.println("Seleccionar periodo, cliente");
			return ;
		}
		try{
			BigDecimal totalM =  BigDecimal.ZERO;
			FiltroProyClienteBean filtrosSQL = new FiltroProyClienteBean();
			filtrosSQL.setIdCliente(idCliente);
			filtrosSQL.setIdLocalCliente(idLocalCliente);
			filtrosSQL.setIdPeriodo(periodoDefault);
			ListaProyCanalMarcasResponse response =  mantProyeccionClienteService.mostrarProyClienteMarcas(ObtenerIdTransaccion(), filtrosSQL);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaProyeccionClienteMarcas = response.getListaProyeccionCanalMarcas();
				for(ProyeccionGeneralMarcasBean ls : listaProyeccionClienteMarcas){
					totalM = totalM.add(ls.getMontoTotal());
				}
				DecimalFormatSymbols simbolo=new DecimalFormatSymbols();
			    simbolo.setDecimalSeparator('.');
			    simbolo.setGroupingSeparator(',');
			    DecimalFormat formateador = new DecimalFormat("###,###.##",simbolo);
				totalMarcas = formateador.format(totalM.setScale(3, BigDecimal.ROUND_HALF_UP));
			}else{
				this.listaProyeccionClienteMarcas  = new ArrayList<ProyeccionGeneralMarcasBean>();
			}
		}catch(Exception e){
			System.out.println("Error al tratar de obtener lista de proyeccion de marcas " +e);
			this.listaProyeccionClienteMarcas  = new ArrayList<ProyeccionGeneralMarcasBean>();
		}
	}
	public void cargarPeriodos() {
		try {
			PeriodoListaBean periodos = mantenimientoPeriodo.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos = periodos.getListaPeriodos();
		} catch (Exception e) {
			System.out.println("Error al cargar los periodos: " + e);
		}
	}
	public void mostrarPeriodoDefault() {
		for (PeriodoBean ls : getListaPeriodos()) {
			if (ls.getDefecto() != null && ls.getDefecto() == true) {
				setPeriodoDefault(ls.getId());
			}
		}
	}
	public void cargarZonas(){
		try{
			FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			ZonaListaResponse zonas = mantenimientoZona.listaZonas(ObtenerIdTransaccion(), filtro);
			if(zonas.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaZonas =zonas.getListaZonas();
			}
			
		}catch(Exception e){
			System.out.println("Error al obtener las zonas: " + e);
		}
	}
	public void cargarCanales(){
		try{
			FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			 CategoriaClienteListaRes canales = mantenimientoCategoriaCliente.listaCategoriaCliente(ObtenerIdTransaccion(), filtro);
			if(canales.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaCanales =canales.getListaCategoriaCliente();
			}
			
		}catch(Exception e){
			System.out.println("Error al obtener los canales: " + e);
		}
	}
	
	public void cargarClientes(){
		if(idFfvv < 1){
			System.out.println("Seleccionar FFVV");
			return ;
		}
		try{
			FiltroVendedoClienteFO filtroSQL =new FiltroVendedoClienteFO();
			filtroSQL.setActive(true);
			filtroSQL.setIdFfvv(idFfvv);
			ListaVendedorClienteResponse response = mantVendedorClienteService.listaVendedorCliente(ObtenerIdTransaccion(), filtroSQL);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaClientes = response.getListaVendedorCliente();
			}else{
				this.listaClientes = new ArrayList<VendedorClienteBean>();
			}
		}catch(Exception e){
			this.listaClientes = new ArrayList<VendedorClienteBean>();
			System.out.println("Error al capturar la lista de clientes  " + e);
		}
	}
	public void cargarFFVV() {
		try {
			FiltrosSQLBean filtro = new FiltrosSQLBean();
			List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			List<Object> valores = new ArrayList<Object>();

			FiltrosBean filtroCampos = new FiltrosBean();
			List<String> campos = new ArrayList<String>();
			campos.add("ee.active");
			filtroCampos.setCampos(campos);
			filtroCampos.setOperador("=");
			listaFiltros.add(filtroCampos);
			valores.add(true);

			if (idZona > 0) {
				// filtro por zona
				FiltrosBean filtroZona = new FiltrosBean();
				List<String> camposZona = new ArrayList<String>();
				camposZona.add("ee.zona_id");
				filtroZona.setCampos(camposZona);
				filtroZona.setOperador("=");
				listaFiltros.add(filtroZona);
				valores.add(idZona);
			}

			if (idCanal > 0) {
				// filtro por canal
				FiltrosBean filtroCanal = new FiltrosBean();
				List<String> camposCanal = new ArrayList<String>();
				camposCanal.add("ee.categoria_cliente_id");
				filtroCanal.setCampos(camposCanal);
				filtroCanal.setOperador("=");
				listaFiltros.add(filtroCanal);
				valores.add(idCanal);
			}

			filtro.setListaFiltros(listaFiltros);
			filtro.setListaValores(valores);
			ListaFFVVJerarquiaResponse ffvvLista = mantenimientoFFVVService.listaFFVV(ObtenerIdTransaccion(), filtro);
			this.listaFFVV = new ArrayList<FFVVBean>();
			System.out.println("Respuesta FFVV : " + ffvvLista.getCodigoRespuesta());
			if (ffvvLista.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaFFVV = ffvvLista.getListaJerarquiaFFVV();
			}

		} catch (Exception e) {
			System.out.println("Error al Obtener la FFVV " + e.getMessage());
		}
	}
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext()
				.getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public List<ZonaBean> getListaZonas() {
		return listaZonas;
	}

	public void setListaZonas(List<ZonaBean> listaZonas) {
		this.listaZonas = listaZonas;
	}

	public List<CategoriaClienteBean> getListaCanales() {
		return listaCanales;
	}

	public void setListaCanales(List<CategoriaClienteBean> listaCanales) {
		this.listaCanales = listaCanales;
	}

	public List<VendedorClienteBean> getListaClientes() {
		return listaClientes;
	}

	public void setListaClientes(List<VendedorClienteBean> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<FFVVBean> getListaFFVV() {
		return listaFFVV;
	}

	public void setListaFFVV(List<FFVVBean> listaFFVV) {
		this.listaFFVV = listaFFVV;
	}

	public int getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(int periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public int getIdZona() {
		return idZona;
	}

	public void setIdZona(int idZona) {
		this.idZona = idZona;
	}

	public int getIdCanal() {
		return idCanal;
	}

	public void setIdCanal(int idCanal) {
		this.idCanal = idCanal;
	}

	public int getIdFfvv() {
		return idFfvv;
	}

	public void setIdFfvv(int idFfvv) {
		this.idFfvv = idFfvv;
	}

	public int getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}

	public int getIdLocalCliente() {
		return idLocalCliente;
	}

	public void setIdLocalCliente(int idLocalCliente) {
		this.idLocalCliente = idLocalCliente;
	}

	public List<ProyeccionGeneralMarcasBean> getListaProyeccionClienteMarcas() {
		return listaProyeccionClienteMarcas;
	}

	public void setListaProyeccionClienteMarcas(
			List<ProyeccionGeneralMarcasBean> listaProyeccionClienteMarcas) {
		this.listaProyeccionClienteMarcas = listaProyeccionClienteMarcas;
	}

	public String getTotalMarcas() {
		return totalMarcas;
	}

	public void setTotalMarcas(String totalMarcas) {
		this.totalMarcas = totalMarcas;
	}


}
